import cv2
import numpy as np

if __name__ == '__main__':
    # 1. 图片输入
    image_np = cv2.imread('image.jpg')

    # 2. 坐标选取（手动标记文档四个角点，按顺时针顺序：左上、右上、右下、左下）
    pts1 = np.float32([
        [700, 500],    # 左上
        [1100, 370],  # 右上
        [1150, 1150],  # 右下
        [800, 1350]    # 左下
    ])

    # 将float类型的坐标转换为int类型，用于绘制直线
    pts1_int = pts1.astype(np.int32)

    # 在原图上绘制ROI区域边框，方便验证坐标
    image_line = image_np.copy()
    # 绘制四边形边框（左上→右上→右下→左下→左上）
    cv2.line(image_line, tuple(pts1_int[0]), tuple(pts1_int[1]), (0, 0, 255), 2, cv2.LINE_AA)
    cv2.line(image_line, tuple(pts1_int[1]), tuple(pts1_int[2]), (0, 0, 255), 2, cv2.LINE_AA)
    cv2.line(image_line, tuple(pts1_int[2]), tuple(pts1_int[3]), (0, 0, 255), 2, cv2.LINE_AA)
    cv2.line(image_line, tuple(pts1_int[3]), tuple(pts1_int[0]), (0, 0, 255), 2, cv2.LINE_AA)

    # 3. 定义透视变换的目标矩形（文档矫正后的尺寸，可根据需要调整）
    # 这里使用文档的大致宽高比例（示例：宽600，高800，可根据实际内容调整）
    target_width = 1000
    target_height = 1000
    pts2 = np.float32([
        [0, 0],                      # 左上
        [target_width, 0],           # 右上
        [target_width, target_height],  # 右下
        [0, target_height]           # 左下
    ])

    # 4. 计算透视变换矩阵并执行变换
    M = cv2.getPerspectiveTransform(pts1, pts2)
    warped = cv2.warpPerspective(
        image_np,
        M,
        (target_width, target_height),
        flags=cv2.INTER_LINEAR,
        borderMode=cv2.BORDER_REPLICATE
    )

    mirroring_image = cv2.flip(warped, 0)


    # 7. 显示所有结果
    cv2.imshow('Original with ROI', image_line)  # 带ROI标记的原图
    cv2.imshow('Warped', mirroring_image)  # 透视矫正后图像
    cv2.imwrite('video card.jpg', mirroring_image)
    cv2.waitKey(0)